package com.uw.ictd.respeak;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import android.widget.Toast;
import com.dropbox.chooser.android.DbxChooser;
public class ListenActivity extends MenuActivity {
private TextView mRequestorName;
private TextView mMaxRewardAmount;
private TextView mCurrentRecording;
private TextView mAudioCurrentDurationLabel;
private TextView mAudioTotalDurationLabel;
private Button mChooserButton;
private DbxChooser mChooser;
private AudioPlayer mPlayer = new AudioPlayer();
private ImageButton mPlayButton;
private Button mListenAgainButton;
private ImageButton mListenAgainImageButton;
private Button mRespeakButton;
private ImageButton mRespeakImageButton;
private SeekBar mAudioProgressBar;
private Handler mHandler = new Handler();
// private UpdateTimeTask mUpdateTimeTask;
static final String EXTRA_PHONE_NUMBER = "com.uw.ictd.respeak.phone_number";
static final String EXTRA_SUBMISSION = "com.uw.ictd.respeak.submission";
static final int DBX_CHOOSER_REQUEST = 0;
static final int REQUEST_LINK_TO_DBX = 0;
private static final String APP_KEY = "07r2uvgq7r0446r";
private static final String APP_SECRET = "m8gxr8wh6anshmw";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_listen);
getActionBar().setDisplayHomeAsUpEnabled(true);
// If started by training activity, display a toast
Bundle bundle = getIntent().getExtras();
if (bundle != null && bundle.containsKey(EXTRA_SUBMISSION)) {
Toast toast = Toast.makeText(this, R.string.thank_you_toast, Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.show();
}
mRequestorName = (TextView) findViewById(R.id.requestorName);
mMaxRewardAmount = (TextView) findViewById(R.id.maxRewardAmount);
mCurrentRecording = (TextView) findViewById(R.id.currentRecordingSelected);
mAudioCurrentDurationLabel = (TextView) findViewById(R.id.audioCurrentDurationLabel);
mAudioTotalDurationLabel = (TextView) findViewById(R.id.audioTotalDurationLabel);
mRequestorName.setVisibility(View.INVISIBLE);
mMaxRewardAmount.setVisibility(View.INVISIBLE);
mCurrentRecording.setVisibility(View.INVISIBLE);
mChooserButton = (Button) findViewById(R.id.chooserButton);
mPlayButton = (ImageButton) findViewById(R.id.playButton);
mListenAgainImageButton = (ImageButton) findViewById(R.id.listenAgainImageButton);
mListenAgainButton = (Button) findViewById(R.id.listenAgainButton);
mRespeakImageButton = (ImageButton) findViewById(R.id.respeakImageButton);
mRespeakButton = (Button) findViewById(R.id.respeakButton);
mAudioProgressBar = (SeekBar) findViewById(R.id.audioProgressBar);
mAudioProgressBar.setProgress(0);
mAudioProgressBar.setMax(100);
// Create a new task to update time
// mUpdateTimeTask = new UpdateTimeTask(mPlayer,
// mAudioCurrentDurationLabel, mAudioTotalDurationLabel,
// mAudioProgressBar, mHandler);
mChooser = new DbxChooser(APP_KEY);
// Allows user to pick audio file to open from Dropbox
mChooserButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
DbxChooser.ResultType resultType = DbxChooser.ResultType.DIRECT_LINK;
mChooser.forResultType(resultType).launch(ListenActivity.this,
DBX_CHOOSER_REQUEST);
}
});
// Allows user to play/pause recording
mPlayButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mPlayer.play(ListenActivity.this);
if (mPlayer.isPlaying()) {
// Update progress bar and total time
updateProgressBar();
long totalDuration = mPlayer.getDuration();
mAudioTotalDurationLabel.setText(TimeConverter
.milliSecondsToTimer(totalDuration));
mPlayButton.setBackgroundResource(R.drawable.pause);
} else {
mPlayButton.setBackgroundResource(R.drawable.play);
}
}
});
// Allows user to listen to the recording again. If the recording is
// already playing, restarts from the beginning
OnClickListener listenAgainListener = new OnClickListener() {
@Override
public void onClick(View v) {
mPlayer.stop();
mPlayer.play(ListenActivity.this);
mPlayButton.setBackgroundResource(R.drawable.pause);
}
};
mListenAgainButton.setOnClickListener(listenAgainListener);
mListenAgainImageButton.setOnClickListener(listenAgainListener);
// Starts the recording activity
OnClickListener respeakListener = new OnClickListener() {
@Override
public void onClick(View v) {
// Stop playing the audio and reset the background
mPlayer.stop();
mPlayButton.setBackgroundResource(R.drawable.play);
Intent i = new Intent(ListenActivity.this, RecordActivity.class);
i.putExtra(SubmissionActivity.EXTRA_ORIGINAL_FILE_NAME,
mPlayer.getUri());
startActivity(i);
}
};
mRespeakButton.setOnClickListener(respeakListener);
mRespeakImageButton.setOnClickListener(respeakListener);
// Set listener on audio progress bar that tracks user's touch
OnSeekBarChangeListener seekBarChangeListener = new OnSeekBarChangeListener() {
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// Progress bar no longer updates
mHandler.removeCallbacks(mUpdateTimeTask);
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
mHandler.removeCallbacks(mUpdateTimeTask);
int totalDuration = (int) mPlayer.getDuration();
int currentPosition = TimeConverter.progressToTimer(
seekBar.getProgress(), totalDuration);
// Move audio player forward or backward appropriate number of
// seconds
mPlayer.seekTo(currentPosition);
// Update timers
updateProgressBar();
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
}
};
mAudioProgressBar.setOnSeekBarChangeListener(seekBarChangeListener);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == DBX_CHOOSER_REQUEST) {
if (resultCode == Activity.RESULT_OK) {
DbxChooser.Result result = new DbxChooser.Result(data);
Log.d("main", "Link to selected file: " + result.getLink());
// Check if the user selected an mp3 file
if (result.getName().toString().endsWith(".mp3")
|| result.getName().toString().endsWith(".MP3")) {
// Update to show the requestor's name
// TODO: possibly implement by parsing the file name
mRequestorName.setText("Name of requestor goes here.",
TextView.BufferType.NORMAL);
mRequestorName.setVisibility(View.VISIBLE);
// Update to show the maximum reward amount
mMaxRewardAmount.setText("Max reward amount goes here.",
TextView.BufferType.NORMAL);
mMaxRewardAmount.setVisibility(View.VISIBLE);
// Update to show the current recording selected
mCurrentRecording.setText(result.getName().toString(),
TextView.BufferType.NORMAL);
// Pass the player the new recording to be played
mPlayer.stop();
Uri recording = result.getLink();
mPlayer = new AudioPlayer(recording);
// Error if the user does not select an audio file
} else {
mCurrentRecording.setText(
"Error. You must select an audio file.",
TextView.BufferType.NORMAL);
}
mCurrentRecording.setVisibility(View.VISIBLE);
} else {
// Failed or was cancelled by the user
((TextView) findViewById(R.id.currentRecordingSelected))
.setText("Failed to select recording.");
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
@Override
protected void onPause() {
super.onPause();
mPlayer.stop();
}
// Update timer and audio progress bar
private void updateProgressBar() {
mHandler.postDelayed(mUpdateTimeTask, 100);
}
// Thread to update timers
private Runnable mUpdateTimeTask = new Runnable() {
public void run() {
long currentDuration = mPlayer.getCurrentPosition();
long totalDuration = mPlayer.getDuration();
// Update the current audio duration label
mAudioCurrentDurationLabel.setText(TimeConverter
.milliSecondsToTimer(currentDuration));
// Update the progress bar
int progress = TimeConverter.getProgressPercentage(currentDuration,
totalDuration);
mAudioProgressBar.setProgress(progress);
// Run this thread after 100 milliseconds
mHandler.postDelayed(this, 100);
}
};
}